/*
 * 文件名称:          EnumSerializer.java
 * 版权所有@ 2016——2017 无锡聆音科技有限公司，保留所有权利
 * 时间:             2016年7月27日 下午9:21:11
 */
package com.lingyin.json.serializer;

import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializeWriter;

/**
 *   该类处理对枚举对象的所有属性值都序列化。
 * 
 * @项目        jsonlib
 * 
 * @作者:       关宏新
 * 
 * @日期:       2016年7月27日
 * 
 * @负责人:    关宏新
 * 
 * @负责小组:   聆音项目组
 * 
 */
public class EnumSerializer extends JSONSerializer
{
    private boolean ordinalEnable;   // 是否序列化序号
    private boolean nameEnable;      // 是否序列化名字           

    /**
     * 
     * @param out 序列化输出接口
     */
    public EnumSerializer(SerializeWriter out)
    {
        super(out, new SerializeConfig());
        getMapping().setAsmEnable(false);
    } 
    
    /**
     * 
     * @param out 序列化输出接口
     * @param ordinalEnable 枚举的序号是否需要序列化
     * @param nameEnable 枚举的名字是否需要序列化
     */
    public EnumSerializer(SerializeWriter out, boolean ordinalEnable, boolean nameEnable)
    {
        super(out, new SerializeConfig());
        this.ordinalEnable = ordinalEnable;
        this.nameEnable = nameEnable;
        getMapping().setAsmEnable(false);
    }        
    
    /**
     * 获取对象的序列化实例
     *(non-Javadoc)
     * @see com.alibaba.fastjson.serializer.JSONSerializer#getObjectWriter(java.lang.Class)
     * @param clazz 需要序列化的类
     */
    public ObjectSerializer getObjectWriter(Class<?> clazz) 
    {
        SerializeConfig config = getMapping();
        ObjectSerializer writer = config.get(clazz);
        if (writer == null)
        {
            if (clazz.isEnum() || (clazz.getSuperclass() != null && clazz.getSuperclass().isEnum())) 
            {
                writer = new EnumValueSerializer(clazz, ordinalEnable, nameEnable);
                config.put(clazz, writer);
                return writer;
            }
        }
        return super.getObjectWriter(clazz);            
    }
    
}
